실수로 잘못된 파일을 Git에 커밋했지만 아직 커밋을 서버에 푸시하지 않았습니다. 로컬 저장소에서 커밋을 어떻게 취소 할 수 있습니까?
1 2 삼 다음 커밋 실행 취소 및 다시 실행 $ git commit -m "뭔가 몹시 잘못 안내했습니다"# (0 : 귀하의 사고) $ git reset HEAD ~ # (1) << 필요에 따라 파일 편집 >> # (2) $ git add. # (삼) $ git commit -c ORIG_HEAD # (4) 이 명령은 실행 취소를 담당합니다. 작업 트리 (디스크의 파일 상태)는 그대로두고 마지막 커밋을 실행 취소합니다. 다시 커밋하기 전에 다시 추가해야합니다.) 작업 트리 파일을 수정합니다. git은 새 커밋에 포함하려는 모든 것을 추가합니다. 이전 커밋 메시지를 재사용하여 변경 사항을 커밋합니다. reset은 이전 헤드를 .git / ORIG_HEAD에 복사했습니다. -c ORIG_HEAD로 커밋하면 처음에 이전 커밋의 로그 메시지를 포함하고 편집 할 수있는 편집기가 열립니다. 메시지를 편집 할 필요가 없으면 -C 옵션을 사용할 수 있습니다. 또는 이전 커밋 (또는 커밋 메시지 만)을 편집하려면 commit --amend가 현재 인덱스 내의 변경 사항을 이전 커밋에 추가합니다. 서버에 푸시 된 커밋을 제거 (되 돌리지 않음)하려면 git push origin master --force로 기록을 다시 작성해야합니다. 추가 읽기 HEAD를 이전 위치로 다시 이동하려면 어떻게해야합니까? (분리 된 머리) & 커밋 취소 위의 답변은 되돌리려는 커밋의 SHA-1을 결정하는 데 사용할 수있는 git reflog를 보여줍니다. 이 값이 있으면 위에서 설명한대로 일련의 명령을 사용하십시오. HEAD ~는 HEAD ~ 1과 동일합니다. 기사 git의 HEAD는 무엇입니까? 여러 커밋을 커밋 해제하려는 경우 유용합니다. | 커밋이 어떻게 작동하는지 모르는 경우 커밋을 취소하는 것은 약간 무섭습니다. 하지만 이해한다면 실제로 놀랍도록 쉽습니다. 커밋을 취소 할 수있는 4 가지 방법을 보여 드리겠습니다. 옵션 1 : git reset --hard C는 HEAD이고 (F)는 파일의 상태입니다. (에프) 알파벳 ↑ 석사 커밋 C를 핵무기하고 다시 보지 않고 로컬로 수정 된 파일의 모든 변경 사항을 잃고 싶습니다. 당신은 이렇게 : git reset --hard HEAD ~ 1 결과는 다음과 같습니다. (에프) A-B ↑ 석사 이제 B는 HEAD입니다. --hard를 사용했기 때문에 파일이 커밋 B의 상태로 재설정됩니다. 옵션 2 : git reset 아,하지만 커밋 C가 재앙이 아니라 약간 벗어났다고 가정 해보자. 커밋을 실행 취소하고 싶지만 더 나은 커밋을 수행하기 전에 약간의 편집을 위해 변경 사항을 유지합니다. 여기서 다시 시작하여 C를 HEAD로 사용합니다. (에프) 알파벳 ↑ 석사 --hard를 생략하고 이렇게 할 수 있습니다. git reset HEAD ~ 1 이 경우 결과는 다음과 같습니다. (에프) 알파벳 ↑ 석사 두 경우 모두 HEAD는 최신 커밋에 대한 포인터 일뿐입니다. git reset HEAD ~ 1을 수행하면 Git에게 HEAD 포인터를 한 커밋 뒤로 이동하도록 지시합니다. 그러나 (--hard를 사용하지 않는 한) 파일을 그대로 둡니다. 이제 git status는 C에 체크인 한 변경 사항을 보여줍니다. 당신은 아무것도 잃지 않았습니다! 옵션 3 : git reset --soft 가장 가벼운 터치를 위해 커밋을 실행 취소 할 수도 있지만 파일과 색인은 그대로 둡니다. git reset --soft HEAD ~ 1 이렇게하면 파일 만 남을뿐만 아니라 인덱스도 그대로 유지됩니다. git status를 수행하면 이전과 동일한 파일이 색인에 있음을 알 수 있습니다. 사실,이 명령 바로 뒤에 git commit을 수행 할 수 있으며 방금 가졌던 동일한 커밋을 다시 실행할 수 있습니다. 옵션 4 : git reset --hard를 수행했으며 해당 코드를 다시 가져와야합니다. 한 가지 더 : 첫 번째 예에서와 같이 커밋을 삭제했는데 결국 필요하다는 것을 발견했다고 가정 해 보겠습니다. 운이 좋지 않습니까? 아니, 되돌릴 수있는 방법이 아직 있습니다. git reflog를 입력하면 이동 한 (일부) 커밋 샤 (즉, 해시) 목록이 표시됩니다. 파괴 한 커밋을 찾고 다음을 수행합니다. git checkout -b someNewBranchName shaYouDestroyed 이제 그 커밋을 부활 시켰습니다. 커밋은 실제로 약 90 일 동안 Git에서 파괴되지 않으므로 일반적으로 제거 할 의도가 없었던 것을 복구하여 구출 할 수 있습니다. | 커밋을 이미 공개 (원격 저장소로 푸시)했는지 여부에 따라 마지막 커밋을 "실행 취소"하는 두 가지 방법이 있습니다. 로컬 커밋을 실행 취소하는 방법 로컬로 커밋했지만 이제 해당 커밋을 제거하고 싶습니다. 자식 로그 commit 101 : bad commit # 최근 커밋. 이를 'HEAD'라고합니다. commit 100 : good commit # 두 번째에서 마지막 커밋까지. 이것이 우리가 원하는 것입니다. 모든 것을 마지막 커밋 이전의 방식으로 복원하려면 HEAD 이전의 커밋으로 재설정해야합니다. git reset --soft HEAD ^ # 변경 사항을 유지하려면 --soft 사용 git reset --hard HEAD ^ # 변경 사항을 유지하는 데 신경 쓰지 않는다면 --hard 사용 이제 git log에 마지막 커밋이 제거되었음을 표시합니다. 공개 커밋을 실행 취소하는 방법 이미 커밋을 공개 한 경우 이전 커밋 (현재 HEAD)에서 변경 한 내용을 "되 돌리는"새 커밋을 만들고 싶을 것입니다. git revert HEAD 이제 변경 사항이 되돌려집니다.커밋 할 준비가되었습니다. git commit -m '내가 실수로 제거한 파일 복원' 자식 로그 커밋 102 : 실수로 제거한 파일 복원 커밋 101 : 필요하지 않은 파일 제거 commit 100 : 필요한 파일 추가 자세한 내용은 Git 기본 사항-작업 취소를 참조하세요. | 원하는 방식으로 파일을 추가 / 제거합니다. git rm classdir git add sourcedir 그런 다음 커밋을 수정합니다. git commit --amend 이전의 잘못된 커밋은 새 인덱스 상태를 반영하도록 편집됩니다. 즉, 처음부터 실수를 한 적이없는 것과 같습니다. 아직 푸시하지 않은 경우에만이 작업을 수행해야합니다. 푸시했다면 정상적으로 수정을 수행하면됩니다. | git rm yourfiles / *. class git commit -a -m " 'yourfiles'폴더의 모든 클래스 파일을 삭제했습니다." 또는 git reset --hard HEAD ~ 1 경고 : 위의 명령은 커밋하려는 .java 파일 (및 기타 파일)에 대한 수정 사항을 영구적으로 제거합니다. HEAD-1에 대한 하드 리셋은 작업 복사본을 잘못된 커밋 이전의 커밋 상태로 설정합니다. | 마지막 커밋을 변경하려면 색인에서 파일을 바꿉니다. git rm --cached * .class git add * .java 그런 다음 비공개 브랜치 인 경우 커밋을 수정합니다. git commit --amend 또는 공유 브랜치 인 경우 새 커밋을 만듭니다. git commit -m '.class 파일을 .java 파일로 바꾸기' (이전 커밋을 변경하려면 멋진 대화 형 리베이스를 사용하세요.) ProTip ™ : * .class를 gitignore에 추가하여이 문제가 다시 발생하지 않도록합니다. 커밋을 되돌리려면 마지막 커밋을 변경해야하는 경우 커밋을 수정하는 것이 이상적인 솔루션이지만보다 일반적인 솔루션이 재설정됩니다. 다음을 사용하여 Git을 커밋으로 재설정 할 수 있습니다. git reset @ ~ N 여기서 N은 HEAD 이전 커밋 수이고 @ ~는 이전 커밋으로 재설정됩니다. 따라서 커밋을 수정하는 대신 다음을 사용할 수 있습니다. git reset @ ~ git add * .java git commit -m ".java 파일 추가" 이것이 무엇을하는지 더 잘 이해하려면 git help reset, 특히 --soft --mixed 및 --hard 섹션을 확인하십시오. Reflog 엉망이 된 경우 언제든지 reflog를 사용하여 삭제 된 커밋을 찾을 수 있습니다. $ 자식 재설정 @ ~ $ 자식 리플 로그 c4f708b HEAD @ {0} : 재설정 : @ ~로 이동 2c52489 HEAD @ {1} : 커밋 : 일부 .class 파일 추가 $ 자식 재설정 2c52489 ... 그리고 당신은 당신이 시작한 곳으로 돌아 왔습니다. | git revert를 사용하십시오. 커밋 ID를 얻으려면 git log를 사용하십시오. | 로컬 커밋을 완전히 실행 취소 할 계획이라면 커밋에서 변경 한 사항이 무엇이든 상관 없으면 다음 명령을 수행하십시오. git reset --hard HEAD ^ 1 (이 명령은 전체 커밋을 무시하고 변경 사항이 로컬 작업 트리에서 완전히 손실됩니다). 커밋을 실행 취소하고 싶지만 스테이징 영역에서 변경 사항을 원하는 경우 (git add 후와 마찬가지로 커밋 전) 다음 명령을 수행합니다. git reset --soft HEAD ^ 1 이제 커밋 된 파일이 스테이징 영역으로 들어옵니다. 잘못된 콘텐츠를 편집해야하기 때문에 파일을 업 스테이징하려는 경우 다음 명령을 수행합니다. git reset HEAD 이제 준비된 영역에서 준비되지 않은 영역으로 파일을 커밋했습니다. 이제 파일을 편집 할 준비가되었으므로 변경 한 내용이 무엇이든 편집하고 추가 한 다음 새 / 새 커밋을 만들고 싶습니다. 더보기 (연결 끊김) (보관 버전) | Git Extras가 설치되어있는 경우 git undo를 실행하여 최신 커밋을 실행 취소 할 수 있습니다. git undo 3은 마지막 세 커밋을 취소합니다. | 공유 저장소에서 최근 5 개의 커밋을 실행 취소하고 싶었습니다. 롤백하려는 개정 ID를 찾았습니다. 그런 다음 다음을 입력했습니다. 프롬프트> git reset --hard 5a7404742c85 HEAD는 현재 5a74047입니다. 카탈로그에 한 페이지 더 추가됨 프롬프트> git push origin master --force 총 0 (델타 0), 재사용 0 (델타 0) 원격 : bb / acl : 네온 아이가 허용됩니다. 허용 된 페이로드. git@bitbucket.org : thecompany / prometheus.git + 09a6480 ... 5a74047 마스터-> 마스터 (강제 업데이트) 프롬프트> | 제거 할 커밋을 선택할 수있는 멋진 목록이 나타나기 때문에이 작업에 git rebase -i를 사용하는 것을 선호합니다. 여기에있는 다른 답변만큼 직접적이지는 않지만 옳다고 느껴집니다. 나열 할 커밋 수를 선택한 다음 다음과 같이 호출합니다 (마지막 세 개를 등록). 자식 rebase -i HEAD ~ 3 샘플 목록 RtmpSrv 포트에 대한 aa28ba7 온 전성 검사를 선택하십시오. c26c541 RtmpSrv 버전 옵션 선택 58d6909 더 나은 URL 디코딩 지원 선택 그런 다음 Git은 제거하는 모든 줄에 대한 커밋을 제거합니다. | 이전 로컬 커밋을 수정하는 방법 git-gui (또는 유사)를 사용하여 git commit --amend를 수행하십시오. GUI에서 커밋에서 개별 파일을 추가하거나 제거 할 수 있습니다. 커밋 메시지를 수정할 수도 있습니다. 이전 로컬 커밋을 실행 취소하는 방법 브랜치를 이전 위치로 재설정하기 만하면됩니다 (예 : gitk 또는 git rebase 사용). 그런 다음 저장된 사본에서 변경 사항을 다시 적용하십시오. 로컬 저장소에서 가비지 수집 후 원하지 않는 커밋이 발생하지 않은 것과 같습니다. 이 모든 작업을 단일 명령으로 수행하려면 git reset HEAD ~ 1을 사용하십시오. 워드경고 : git reset의 부주의 한 사용은 작업 복사본을 혼란스러운 상태로 만드는 좋은 방법입니다. Git 초보자는 가능하다면 이것을 피하는 것이 좋습니다. 공개 커밋을 실행 취소하는 방법 변경 사항을 취소하려면 역 체리 선택 (git-revert)을 수행합니다. 브랜치에 다른 변경 사항을 아직 가져 오지 않았다면 간단히 수행 할 수 있습니다. git revert --no-edit HEAD 그런 다음 업데이트 된 분기를 공유 저장소로 푸시합니다. 커밋 기록은 두 커밋을 개별적으로 표시합니다. 고급 : 공용 저장소의 개인 분기 수정 이것은 위험 할 수 있습니다. 반박 할 지점의 로컬 사본이 있는지 확인하십시오. 또한 참고 : 다른 사람이 브랜치에서 작업하고있는 경우에는이 작업을 수행하지 마십시오. git push --delete (branch_name) ## 브랜치의 공개 버전 제거 지사를 로컬에서 정리 한 다음 다시 제출하십시오. git push origin (branch_name) 정상적인 경우에는 개인 브랜치 커밋 기록이 원래 상태인지 걱정할 필요가 없습니다. 후속 커밋을 푸시하고 (위의 '공개 커밋 실행 취소 방법'참조) 나중에 스쿼시 병합을 수행하여 기록을 숨 깁니다. | 영구적으로 실행 취소하고 일부 저장소를 복제 한 경우 커밋 ID는 다음에서 볼 수 있습니다. 자식 로그 그러면 할 수 있습니다- git reset --hard git push origin -f | 쓰레기를 저질렀지만 밀어 붙이지 않았다면 git reset --soft HEAD ~ 1 HEAD ~ 1은 헤드 이전 커밋의 약어입니다. 또는 재설정하려는 경우 해시의 SHA-1을 참조 할 수 있습니다. --soft 옵션은 커밋을 삭제하지만 git 상태가 표시하는 것처럼 변경된 모든 파일을 "커밋 할 변경 사항"으로 남겨 둡니다. 헤드 이전 커밋 이후 작업 트리에서 추적 된 파일의 변경 사항을 제거하려면 대신 "--hard"를 사용합니다. 또는 이미 밀고 누군가가 일반적으로 내 경우에 당겼다면 git reset을 사용할 수 없습니다. 그러나 git 되돌리기를 수행 할 수 있습니다. git revert HEAD 이것은 우발적 인 커밋에 의해 도입 된 모든 것을 되 돌리는 새로운 커밋을 생성합니다. | SourceTree (GitHub 용 GUI)에서 커밋을 마우스 오른쪽 버튼으로 클릭하고 'Reverse Commit'을 수행 할 수 있습니다. 변경 사항을 취소해야합니다. 터미널에서 : 또는 다음을 사용할 수 있습니다. 자식 되돌리기 또는: git reset --soft HEAD ^ # 변경 사항을 유지하려면 --soft를 사용하십시오. git reset --hard HEAD ^ # 변경 사항을 유지하지 않으려면 --hard를 사용하십시오. | 단일 명령 : git reset --soft 'HEAD ^' 마지막 로컬 커밋을 실행 취소하는 것이 좋습니다! | git을 사용하여 아래 명령을 수행하여 재설정하십시오. git reset --soft HEAD ~ 1 설명 : git reset이 수행하는 작업은 기본적으로 돌아 가려는 커밋으로 재설정됩니다. 그런 다음 --soft key와 결합하면 되돌아 가지만 변경 사항은 파일에 유지되므로 방금 파일이 추가 된 단계로 돌아 가면 HEAD가 브랜치의 헤드이고 ~ 1과 결합하면 (이 경우 HEAD ^도 사용) 원하는 커밋 하나만 돌아갑니다. .. 실제 상황에서 발생할 수있는 모든 단계와 코드 커밋을 포함하여 아래 이미지의 단계를 더 자세히 작성합니다. | 마지막 Git 커밋을 실행 취소하는 방법은 무엇입니까? 모든 것을 마지막 커밋 이전의 방식으로 되돌리려면 HEAD 이전 커밋으로 재설정해야합니다. 변경 한 내용을 유지하지 않으려면 : git reset --hard HEAD ^ 변경 사항을 유지하려면 : git reset --soft HEAD ^ 이제 git 로그를 확인하십시오. 마지막 커밋이 제거되었음을 보여줍니다. | "작업 트리를 마지막 커밋으로 재설정" git reset --hard HEAD ^ "작업 트리에서 알 수없는 파일 정리" git clean 참조-Git 빠른 참조 참고 :이 명령은 이전 커밋을 삭제하므로주의해서 사용하십시오! git reset --hard가 더 안전합니다. | reflog를 사용하여 올바른 상태 찾기 git reflog 재설정하기 전에 새로 고침 올바른 reflog (제 경우에는 f3cb6e2)를 선택하고 입력하십시오. git reset --hard f3cb6e2 그 후 repo HEAD가 해당 HEADid로 재설정됩니다. 재설정 후 로그 마지막으로 리플 로그는 아래 그림과 같습니다. REFLOG 최종 | 첫 실행 : git reflog 저장소에서 수행 한 가능한 모든 작업 (예 : 커밋, 병합, 가져 오기 등)이 표시됩니다. 다음을 수행하십시오. git reset --hard ActionIdFromRefLog | 마지막 커밋 실행 취소 : git reset --soft HEAD ^ 또는 git reset --soft HEAD ~ 이것은 마지막 커밋을 취소합니다. 여기서 --soft는 스테이징으로 재설정됨을 의미합니다. HEAD ~ 또는 HEAD ^는 HEAD 이전에 커밋으로 이동하는 것을 의미합니다. 마지막 커밋을 새 커밋으로 바꿉니다. git commit --amend -m "메시지" 마지막 커밋을 새 커밋으로 대체합니다. | 또 다른 방법: 되돌리려는 브랜치를 체크 아웃 한 다음 로컬 작업 복사본을 원격 서버에서 최신 커밋으로 되 돌리십시오 (그 이후의 모든 작업은 작별이됩니다). 이를 위해 SourceTree에서 마우스 오른쪽 버튼을 클릭하고 "Reset BRANCHNAME to this commit"을 선택했습니다. 그런 다음 저장소의 로컬 디렉터리로 이동하여 다음 명령을 실행합니다. git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEBRANCHNAME : BRANCHNAME 이것은 로컬 저장소의 현재 커밋 이후의 모든 커밋을 지우지 만 해당 브랜치에 대해서만 지 웁니다. | git log를 입력하고 마지막 커밋 해시 코드를 찾은 다음 다음을 입력합니다. git reset <이전 co> | 제 경우에는 실수로 원하지 않는 일부 파일을 커밋했습니다. 그래서 다음을 수행했고 작동했습니다. git reset --soft HEAD ^ git rm --cached [필요하지 않은 파일] git add [필요한 파일] 자식 커밋 -c ORIG_HEAD gitk 또는 git log --stat로 결과 확인 | 간단하게 명령 줄에서 다음을 실행하십시오. git reset --soft HEAD ~ | 두 가지 주요 시나리오가 있습니다. 아직 커밋을 푸시하지 않았습니다. 문제가 커밋 한 추가 파일이고 저장소에있는 파일을 원하지 않는 경우 git rm을 사용하여 제거한 다음 --amend로 커밋 할 수 있습니다. git rm -r로 전체 디렉토리를 제거하거나 다른 Bash 명령과 결합 할 수도 있습니다. git rm -r git rm $ (find -name '* .class') 파일을 제거한 후 --amend 옵션을 사용하여 커밋 할 수 있습니다. git commit --amend -C HEAD # -C 옵션은 동일한 커밋 메시지를 사용하는 것입니다. 이렇게하면 추가 파일을 제거하는 최근 로컬 커밋을 다시 작성하므로 이러한 파일은 푸시시 전송되지 않으며 GC에 의해 로컬 .git 저장소에서도 제거됩니다. 이미 커밋을 푸시했습니다. 다른 시나리오의 동일한 솔루션을 적용한 다음 -f 옵션을 사용하여 git push를 수행 할 수 있지만 원격 기록을 다양한 변경으로 덮어 쓰므로 권장되지 않습니다 (저장소를 엉망으로 만들 수 있음). 대신 --amend없이 커밋을 수행해야합니다 (-amend에 대해 기억하세요 :이 옵션은 마지막 커밋의 기록을 다시 작성합니다). | 로컬 커밋의 경우 git reset --soft HEAD ~ 1 또는 정확히 어떤 커밋인지 기억하지 못하는 경우 git rm --cached <파일> 푸시 된 커밋의 경우 저장소 기록에서 파일을 제거하는 적절한 방법은 git filter-branch를 사용하는 것입니다. 그건, git filter-branch --index-filter 'git rm --cached 'HEAD 하지만이 명령을주의해서 사용하는 것이 좋습니다. 자세한 내용은 git-filter-branch (1) 매뉴얼 페이지를 참조하십시오. | 이전 개정으로 재설정하려면 커밋되지 않은 모든 변경 사항을 영구적으로 삭제합니다. git reset --hard HEAD ~ 1 | 무엇을 사용, 재설정-소프트 또는 재설정-하드? @Kyralessa의 답변에 2 센트를 추가합니다. 무엇을 사용해야할지 확실하지 않은 경우 --soft로 이동하십시오 (이 규칙을 사용하여 안전을 위해 --soft를 기억했습니다). 왜 ? 실수로 --hard를 선택하면 이전에 없었던 변경 사항이 손실됩니다. 실수로 --soft를 선택하면 추가 명령을 적용하여 --hard와 동일한 결과를 얻을 수 있습니다. git reset HEAD file.html git checkout-file.html 전체 예 echo "일부 변경 ..."> file.html git add file.html git commit -m "잘못된 커밋" # 재설정해야합니다 git reset --hard HEAD ~ 1 (변경 취소) # 또는 git reset --soft HEAD ~ 1 # 스테이징으로 돌아 가기 git reset HEAD file.html # 작업 디렉토리로 돌아 가기 git checkout-file.html # 변경 취소 크레딧은 @Kyralessa로 이동합니다. | 1 2 삼 다음 매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다. 찾고있는 답변이 아닙니까? git version-control git-commit undo 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.